from tornado import web, ioloop, httpserver
import tornado.options
from tornado.options import options
import base
'''其他包'''
import os
import json
import base.web
from api.product import product_url

'''为options定义属性'''
tornado.options.define('port', type=int, default=8090, help='服务器端口')
class IndexHandler(base.web.BaseHandler):
    def set_default_headers(self):
        '''设置默认响应头，1'''
        pass
    def prepare(self):
        '''调用prepare方法，在get/post...之前调用 3'''
        pass
    def get(self):
        subject = self.get_query_argument('code', default=0, strip=True)
        '''reverse_url  可以直接用name获取路径'''
        self.write('<a href=' + self.reverse_url('python_url') + '>python</a></br><a href='
             + self.reverse_url('cpp_url') + '>cpp</a>')
    def post(self):
        '''self.request 属性值
            1. method  请求模式
            2. host 主机名
            3. uri 请求的完整资源标识
            4. path 请求路径
            5. query 请求的查询参数
            6. version  http版本
            7. headers 请求头信息，字典
            8. body 请求体数据
            9. remote_ip 请求的ip地址
            10. files 上传的文件
        '''
        req = self.request
        '''get_argument 直接可以整合两种获取参数的方法'''
        code = self.get_argument('code', default='0')
        state = self.get_argument('state', default='0')
        '''获取文件：
             filename 文件名
             body  文件体数据
             content_type  文件类型
        '''
        file = self.request.files
        # self.write(str((code, state)))
        ret = self.db.execute('select name from pj_content where id=1')
        self.write(ret)
    def on_finish(self):
        '''相应结束以后执行'''
        pass
class SubjectHandler(base.web.BaseHandler):
    '''初始化，在url里面写的参数'''
    # def initialize(self, subject):
    #     self.subject = subject
    '''get方法'''
    def get(self):
        # '''输出，可以输出多次'''
        # self.write(self.subject)
        # self.write(self.subject)
        '''输出json'''
        stu = {
            'name': 'xyz',
            'age': 'newbee',
        }
        # self.write(json.dumps(stu))
        # self.write(stu)
        '''可以自己设置header'''
        self.set_header('csrf_token', 'i am the csrf token')
        # 数据库查询
        condition = dict(
            keys = 'id, name',
            key = 'id',
            value = 3
        )
        ret = self.get_sql('select {keys} from pj_content where {key} = {value}'.format(**condition))
        self.write(str(ret[0]['id']))
    '''post方法'''
    def post(self):
        ret = self.db.execute('select name from pj_content where id=1')
        self.write(str(ret))

if __name__ == '__main__':
    '''解析命令行'''
    tornado.options.parse_command_line()
    '''映射路由，参数：
        1. autoreload = true 自动重启，
        2. compiled_template_cache = false 取消缓存编译的模板
        3. static_hash_cache = false 取消缓存静态文件的hash值
        4. service_traceback = true 提供追踪信息
        5. debug = true 可以直接开启上面四个服务
    '''
    current_path = os.path.dirname(__file__)
    app = web.Application([
        web.url(r'/api/python',SubjectHandler, name='python_url'),
        web.url(r'/api/cpp', SubjectHandler, dict(subject = 'cpp'), name='cpp_url'), 
    ] + product_url + [
        (r'/(.*)', web.StaticFileHandler, 
            dict(path = os.path.join(current_path, 'webapp'), default_filename = 'index.html')
        ),
    ], debug = True, static_path = os.path.join(current_path, 'webapp'))
    '''创建httpserver实例'''
    http_server = httpserver.HTTPServer(app)
    '''这里只是绑定，还未监听'''
    http_server.listen(options.port)
    '''启动io循环'''
    ioloop.IOLoop.current().start()